#pragma once

#include <cmath>

namespace Alice
{

// 圆周率
const float PI = atan(1) * 4;

/*
    二维向量
*/
class Vec2
{
public:
    Vec2() : x(0.0f), y(0.0f) {}
    Vec2(float x, float y) : x(x), y(y) {}

    /*
        重载基本数学运算符
    */
    Vec2 operator+(Vec2 const& v) const
    {
        return Vec2(x + v.x, y + v.y);
    }

    Vec2 operator+=(Vec2 const& v)
    {
        x += v.x;
        y += v.y;

        return *this;
    }

    Vec2 operator-(Vec2 const& v) const
    {
        return Vec2(x - v.x, y - v.y);
    }

    Vec2 operator-=(Vec2 const& v)
    {
        x -= v.x;
        y -= v.y;

        return *this;
    }

    Vec2 operator*(Vec2 const& v) const
    {
        return Vec2(x * v.x, y * v.y);
    }

    Vec2 operator*=(Vec2 const& v)
    {
        x *= v.x;
        y *= v.y;

        return *this;
    }

    Vec2 operator*(float scalar) const
    {
        return Vec2(x * scalar, y * scalar);
    }

    Vec2 operator*=(float scalar)
    {
        x *= scalar;
        y *= scalar;

        return *this;
    }

    /*
        计算向量的模长
    */
    static float CalLength(const Vec2& vec);

    /*
        计算一个点绕另一个点旋转后的坐标
    */
    static Vec2 CalRotateDot(const Vec2& dot, const Vec2& center, float angle);

    /*
        计算两个向量的夹角
    */
    static float CalZeta(const Vec2& a, const Vec2& b);

    /*
        计算两个向量的点积
    */
    static float DotProduct(const Vec2& a, const Vec2& b);

    /*
        判断两个向量是否重叠
    */
    static bool IsOverlapping(const Vec2& a, const Vec2& b);

    /*
        计算两个向量重叠的长度
    */
    static float CalOverlappLength(const Vec2& a, const Vec2& b);

    float x, y;
};

} // namespace Alice
